﻿
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Data.SQLite;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;
using 卷书.SQL;

namespace 卷书.SQL
{
    public class SqliteStream : Sqlite
    {
        // - 难点：如何唯一确定 pdf ？
        // - 如果不修改 pdf 则可以根据文件的哈希值进行索引
        // - 如果修改了 pdf 则可以根据文件路径来判断
        // - 因为这两者不能同时修改，因此可以利用 hash 作为索引，如果修改了文件，则哈希变化了，此时文件路径必定不会变化
        // - 如果路径变化了，则哈希必定不会变化， hash 和 文件路径是互相约束关系
        // - 难点就在于如何知道文件的哈希值变化了？

        // 解决方法：通过 itext 获取到前 2 页的内容，该内容作为哈希值
        // 可能出现的问题：如果前2页插入了新的页面，或则其他页面，则可能无法识别，无法识别的时候提示用户

        // 因此 ，数据库中的 hash 是 前两页的哈希

        //缺陷：如果 pdf 都由图片组成，那么哈希会一致

        /// <summary>
        /// 通用 ，用于唯一确定一篇文章
        /// 哈希值、doi、总页码、参考文献数目、标签、arxivid、issn、pmid
        /// </summary>
        public static string SQLITETABLE_BASIC = "create table if not exists basic (hash VARCHAR(32) PRIMARY KEY, title TEXT,   authors TEXT, doi TEXT,  pagecount INT,referencecount INT,  tags TEXT, arxivid TEXT,  issn TEXT,  pmid TEXT)";



        /// <summary>
        /// [J]期刊
        /// </summary>
        public static string SQLITETABLE_JOURNALARTICLE = "create table if not exists journalarticle (hash VARCHAR(32) PRIMARY KEY,  title TEXT,   authors TEXT, journal TEXT,  abstract TEXT,  year INT, volume INT,issue INT, page TEXT, publisher TEXT,  keywords TEXT)";



        /// <summary>
        /// [D]学位论文（英文论文才有 DOI）
        /// 学校、博士/硕士论文、题目、作者、指导教师、学科、学院、日期、摘要、关键词、总页码、参考文献引用数目、DOI、标签
        /// </summary>
        public static string SQLITETABLE_DEGREE = "create table if not exists degree (hash VARCHAR(32) PRIMARY KEY, school TEXT,degreelevel INT,   title TEXT,   authors TEXT, tutor TEXT, discipline TEXT, college TEXT, releasedate TEXT,  year INT, abstract TEXT,  keywords TEXT)";




        public SqliteStream(string path) : base(path)
        {
            cn = new SQLiteConnection("data source=" + SqlitePath);
            cn.Open();
            cmd = new SQLiteCommand();
            cmd.Connection = cn;
        }


        public void CloseDB()
        {
            this.Close();
        }


        public void RunSql(string sqltext)
        {
             ExecuteSql(sqltext);
        }


    }



}
